home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Online / SpeakFreely / src / libdes / des.pl < prev    next >
Perl Script  |  2000-05-18  |  18KB  |  537 lines

  1. #!/usr/local/bin/perl
  2. # Copyright (C) 1993 Eric Young
  3. # des.pl - eric young 22/11/1991 eay@mincom.oz.au or eay@psych.psy.uq.oz.au
  4. # eay - 92/08/31 - I think I have fixed all problems for 64bit
  5. # versions of perl but I could be wrong since I have not tested it yet :-).
  6. #
  7. # This is an implementation of DES in perl.
  8. # The two routines (des_set_key and des_ecb_encrypt)
  9. # take 8 byte objects as arguments.
  10. #
  11. # des_set_key takes an 8 byte string as a key and returns a key schedule
  12. # for use in calls to des_ecb_encrypt.
  13. # des_ecb_encrypt takes three arguments, the first is a key schedule
  14. # (make sure to pass it by reference with the *), the second is 1
  15. # to encrypt, 0 to decrypt.  The third argument is an 8 byte object
  16. # to encrypt.  The function returns an 8 byte object that has been
  17. # DES encrypted.
  18. #
  19. # example:
  20. # require 'des.pl'
  21. #
  22. # $key =pack("C8",0x12,0x23,0x45,0x67,0x89,0xab,0xcd,0xef);
  23. # @ks=  &des_set_key($key);
  24. #
  25. # $outbytes= &des_ecb_encrypt(*ks,1,$data);
  26. # @enc =unpack("C8",$outbytes);
  27. #
  28.  
  29. package des;
  30.  
  31. # The following 8 arrays are used in des_set_key
  32. @skb0=(
  33. # for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 
  34. 0x00000000,0x00000010,0x20000000,0x20000010,
  35. 0x00010000,0x00010010,0x20010000,0x20010010,
  36. 0x00000800,0x00000810,0x20000800,0x20000810,
  37. 0x00010800,0x00010810,0x20010800,0x20010810,
  38. 0x00000020,0x00000030,0x20000020,0x20000030,
  39. 0x00010020,0x00010030,0x20010020,0x20010030,
  40. 0x00000820,0x00000830,0x20000820,0x20000830,
  41. 0x00010820,0x00010830,0x20010820,0x20010830,
  42. 0x00080000,0x00080010,0x20080000,0x20080010,
  43. 0x00090000,0x00090010,0x20090000,0x20090010,
  44. 0x00080800,0x00080810,0x20080800,0x20080810,
  45. 0x00090800,0x00090810,0x20090800,0x20090810,
  46. 0x00080020,0x00080030,0x20080020,0x20080030,
  47. 0x00090020,0x00090030,0x20090020,0x20090030,
  48. 0x00080820,0x00080830,0x20080820,0x20080830,
  49. 0x00090820,0x00090830,0x20090820,0x20090830,
  50. );
  51. @skb1=(
  52. # for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 
  53. 0x00000000,0x02000000,0x00002000,0x02002000,
  54. 0x00200000,0x02200000,0x00202000,0x02202000,
  55. 0x00000004,0x02000004,0x00002004,0x02002004,
  56. 0x00200004,0x02200004,0x00202004,0x02202004,
  57. 0x00000400,0x02000400,0x00002400,0x02002400,
  58. 0x00200400,0x02200400,0x00202400,0x02202400,
  59. 0x00000404,0x02000404,0x00002404,0x02002404,
  60. 0x00200404,0x02200404,0x00202404,0x02202404,
  61. 0x10000000,0x12000000,0x10002000,0x12002000,
  62. 0x10200000,0x12200000,0x10202000,0x12202000,
  63. 0x10000004,0x12000004,0x10002004,0x12002004,
  64. 0x10200004,0x12200004,0x10202004,0x12202004,
  65. 0x10000400,0x12000400,0x10002400,0x12002400,
  66. 0x10200400,0x12200400,0x10202400,0x12202400,
  67. 0x10000404,0x12000404,0x10002404,0x12002404,
  68. 0x10200404,0x12200404,0x10202404,0x12202404,
  69. );
  70. @skb2=(
  71. # for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 
  72. 0x00000000,0x00000001,0x00040000,0x00040001,
  73. 0x01000000,0x01000001,0x01040000,0x01040001,
  74. 0x00000002,0x00000003,0x00040002,0x00040003,
  75. 0x01000002,0x01000003,0x01040002,0x01040003,
  76. 0x00000200,0x00000201,0x00040200,0x00040201,
  77. 0x01000200,0x01000201,0x01040200,0x01040201,
  78. 0x00000202,0x00000203,0x00040202,0x00040203,
  79. 0x01000202,0x01000203,0x01040202,0x01040203,
  80. 0x08000000,0x08000001,0x08040000,0x08040001,
  81. 0x09000000,0x09000001,0x09040000,0x09040001,
  82. 0x08000002,0x08000003,0x08040002,0x08040003,
  83. 0x09000002,0x09000003,0x09040002,0x09040003,
  84. 0x08000200,0x08000201,0x08040200,0x08040201,
  85. 0x09000200,0x09000201,0x09040200,0x09040201,
  86. 0x08000202,0x08000203,0x08040202,0x08040203,
  87. 0x09000202,0x09000203,0x09040202,0x09040203,
  88. );
  89. @skb3=(
  90. # for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 
  91. 0x00000000,0x00100000,0x00000100,0x00100100,
  92. 0x00000008,0x00100008,0x00000108,0x00100108,
  93. 0x00001000,0x00101000,0x00001100,0x00101100,
  94. 0x00001008,0x00101008,0x00001108,0x00101108,
  95. 0x04000000,0x04100000,0x04000100,0x04100100,
  96. 0x04000008,0x04100008,0x04000108,0x04100108,
  97. 0x04001000,0x04101000,0x04001100,0x04101100,
  98. 0x04001008,0x04101008,0x04001108,0x04101108,
  99. 0x00020000,0x00120000,0x00020100,0x00120100,
  100. 0x00020008,0x00120008,0x00020108,0x00120108,
  101. 0x00021000,0x00121000,0x00021100,0x00121100,
  102. 0x00021008,0x00121008,0x00021108,0x00121108,
  103. 0x04020000,0x04120000,0x04020100,0x04120100,
  104. 0x04020008,0x04120008,0x04020108,0x04120108,
  105. 0x04021000,0x04121000,0x04021100,0x04121100,
  106. 0x04021008,0x04121008,0x04021108,0x04121108,
  107. );
  108. @skb4=(
  109. # for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 
  110. 0x00000000,0x10000000,0x00010000,0x10010000,
  111. 0x00000004,0x10000004,0x00010004,0x10010004,
  112. 0x20000000,0x30000000,0x20010000,0x30010000,
  113. 0x20000004,0x30000004,0x20010004,0x30010004,
  114. 0x00100000,0x10100000,0x00110000,0x10110000,
  115. 0x00100004,0x10100004,0x00110004,0x10110004,
  116. 0x20100000,0x30100000,0x20110000,0x30110000,
  117. 0x20100004,0x30100004,0x20110004,0x30110004,
  118. 0x00001000,0x10001000,0x00011000,0x10011000,
  119. 0x00001004,0x10001004,0x00011004,0x10011004,
  120. 0x20001000,0x30001000,0x20011000,0x30011000,
  121. 0x20001004,0x30001004,0x20011004,0x30011004,
  122. 0x00101000,0x10101000,0x00111000,0x10111000,
  123. 0x00101004,0x10101004,0x00111004,0x10111004,
  124. 0x20101000,0x30101000,0x20111000,0x30111000,
  125. 0x20101004,0x30101004,0x20111004,0x30111004,
  126. );
  127. @skb5=(
  128. # for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 
  129. 0x00000000,0x08000000,0x00000008,0x08000008,
  130. 0x00000400,0x08000400,0x00000408,0x08000408,
  131. 0x00020000,0x08020000,0x00020008,0x08020008,
  132. 0x00020400,0x08020400,0x00020408,0x08020408,
  133. 0x00000001,0x08000001,0x00000009,0x08000009,
  134. 0x00000401,0x08000401,0x00000409,0x08000409,
  135. 0x00020001,0x08020001,0x00020009,0x08020009,
  136. 0x00020401,0x08020401,0x00020409,0x08020409,
  137. 0x02000000,0x0A000000,0x02000008,0x0A000008,
  138. 0x02000400,0x0A000400,0x02000408,0x0A000408,
  139. 0x02020000,0x0A020000,0x02020008,0x0A020008,
  140. 0x02020400,0x0A020400,0x02020408,0x0A020408,
  141. 0x02000001,0x0A000001,0x02000009,0x0A000009,
  142. 0x02000401,0x0A000401,0x02000409,0x0A000409,
  143. 0x02020001,0x0A020001,0x02020009,0x0A020009,
  144. 0x02020401,0x0A020401,0x02020409,0x0A020409,
  145. );
  146. @skb6=(
  147. # for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 
  148. 0x00000000,0x00000100,0x00080000,0x00080100,
  149. 0x01000000,0x01000100,0x01080000,0x01080100,
  150. 0x00000010,0x00000110,0x00080010,0x00080110,
  151. 0x01000010,0x01000110,0x01080010,0x01080110,
  152. 0x00200000,0x00200100,0x00280000,0x00280100,
  153. 0x01200000,0x01200100,0x01280000,0x01280100,
  154. 0x00200010,0x00200110,0x00280010,0x00280110,
  155. 0x01200010,0x01200110,0x01280010,0x01280110,
  156. 0x00000200,0x00000300,0x00080200,0x00080300,
  157. 0x01000200,0x01000300,0x01080200,0x01080300,
  158. 0x00000210,0x00000310,0x00080210,0x00080310,
  159. 0x01000210,0x01000310,0x01080210,0x01080310,
  160. 0x00200200,0x00200300,0x00280200,0x00280300,
  161. 0x01200200,0x01200300,0x01280200,0x01280300,
  162. 0x00200210,0x00200310,0x00280210,0x00280310,
  163. 0x01200210,0x01200310,0x01280210,0x01280310,
  164. );
  165. @skb7=(
  166. # for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 
  167. 0x00000000,0x04000000,0x00040000,0x04040000,
  168. 0x00000002,0x04000002,0x00040002,0x04040002,
  169. 0x00002000,0x04002000,0x00042000,0x04042000,
  170. 0x00002002,0x04002002,0x00042002,0x04042002,
  171. 0x00000020,0x04000020,0x00040020,0x04040020,
  172. 0x00000022,0x04000022,0x00040022,0x04040022,
  173. 0x00002020,0x04002020,0x00042020,0x04042020,
  174. 0x00002022,0x04002022,0x00042022,0x04042022,
  175. 0x00000800,0x04000800,0x00040800,0x04040800,
  176. 0x00000802,0x04000802,0x00040802,0x04040802,
  177. 0x00002800,0x04002800,0x00042800,0x04042800,
  178. 0x00002802,0x04002802,0x00042802,0x04042802,
  179. 0x00000820,0x04000820,0x00040820,0x04040820,
  180. 0x00000822,0x04000822,0x00040822,0x04040822,
  181. 0x00002820,0x04002820,0x00042820,0x04042820,
  182. 0x00002822,0x04002822,0x00042822,0x04042822,
  183. );
  184.  
  185. @shifts2=(0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0);
  186.  
  187. # used in ecb_encrypt
  188. @SP0=(
  189. 0x00410100, 0x00010000, 0x40400000, 0x40410100,
  190. 0x00400000, 0x40010100, 0x40010000, 0x40400000,
  191. 0x40010100, 0x00410100, 0x00410000, 0x40000100,
  192. 0x40400100, 0x00400000, 0x00000000, 0x40010000,
  193. 0x00010000, 0x40000000, 0x00400100, 0x00010100,
  194. 0x40410100, 0x00410000, 0x40000100, 0x00400100,
  195. 0x40000000, 0x00000100, 0x00010100, 0x40410000,
  196. 0x00000100, 0x40400100, 0x40410000, 0x00000000,
  197. 0x00000000, 0x40410100, 0x00400100, 0x40010000,
  198. 0x00410100, 0x00010000, 0x40000100, 0x00400100,
  199. 0x40410000, 0x00000100, 0x00010100, 0x40400000,
  200. 0x40010100, 0x40000000, 0x40400000, 0x00410000,
  201. 0x40410100, 0x00010100, 0x00410000, 0x40400100,
  202. 0x00400000, 0x40000100, 0x40010000, 0x00000000,
  203. 0x00010000, 0x00400000, 0x40400100, 0x00410100,
  204. 0x40000000, 0x40410000, 0x00000100, 0x40010100,
  205. );
  206. @SP1=(
  207. 0x08021002, 0x00000000, 0x00021000, 0x08020000,
  208. 0x08000002, 0x00001002, 0x08001000, 0x00021000,
  209. 0x00001000, 0x08020002, 0x00000002, 0x08001000,
  210. 0x00020002, 0x08021000, 0x08020000, 0x00000002,
  211. 0x00020000, 0x08001002, 0x08020002, 0x00001000,
  212. 0x00021002, 0x08000000, 0x00000000, 0x00020002,
  213. 0x08001002, 0x00021002, 0x08021000, 0x08000002,
  214. 0x08000000, 0x00020000, 0x00001002, 0x08021002,
  215. 0x00020002, 0x08021000, 0x08001000, 0x00021002,
  216. 0x08021002, 0x00020002, 0x08000002, 0x00000000,
  217. 0x08000000, 0x00001002, 0x00020000, 0x08020002,
  218. 0x00001000, 0x08000000, 0x00021002, 0x08001002,
  219. 0x08021000, 0x00001000, 0x00000000, 0x08000002,
  220. 0x00000002, 0x08021002, 0x00021000, 0x08020000,
  221. 0x08020002, 0x00020000, 0x00001002, 0x08001000,
  222. 0x08001002, 0x00000002, 0x08020000, 0x00021000,
  223. );
  224. @SP2=(
  225. 0x20800000, 0x00808020, 0x00000020, 0x20800020,
  226. 0x20008000, 0x00800000, 0x20800020, 0x00008020,
  227. 0x00800020, 0x00008000, 0x00808000, 0x20000000,
  228. 0x20808020, 0x20000020, 0x20000000, 0x20808000,
  229. 0x00000000, 0x20008000, 0x00808020, 0x00000020,
  230. 0x20000020, 0x20808020, 0x00008000, 0x20800000,
  231. 0x20808000, 0x00800020, 0x20008020, 0x00808000,
  232. 0x00008020, 0x00000000, 0x00800000, 0x20008020,
  233. 0x00808020, 0x00000020, 0x20000000, 0x00008000,
  234. 0x20000020, 0x20008000, 0x00808000, 0x20800020,
  235. 0x00000000, 0x00808020, 0x00008020, 0x20808000,
  236. 0x20008000, 0x00800000, 0x20808020, 0x20000000,
  237. 0x20008020, 0x20800000, 0x00800000, 0x20808020,
  238. 0x00008000, 0x00800020, 0x20800020, 0x00008020,
  239. 0x00800020, 0x00000000, 0x20808000, 0x20000020,
  240. 0x20800000, 0x20008020, 0x00000020, 0x00808000,
  241. );
  242. @SP3=(
  243. 0x00080201, 0x02000200, 0x00000001, 0x02080201,
  244. 0x00000000, 0x02080000, 0x02000201, 0x00080001,
  245. 0x02080200, 0x02000001, 0x02000000, 0x00000201,
  246. 0x02000001, 0x00080201, 0x00080000, 0x02000000,
  247. 0x02080001, 0x00080200, 0x00000200, 0x00000001,
  248. 0x00080200, 0x02000201, 0x02080000, 0x00000200,
  249. 0x00000201, 0x00000000, 0x00080001, 0x02080200,
  250. 0x02000200, 0x02080001, 0x02080201, 0x00080000,
  251. 0x02080001, 0x00000201, 0x00080000, 0x02000001,
  252. 0x00080200, 0x02000200, 0x00000001, 0x02080000,
  253. 0x02000201, 0x00000000, 0x00000200, 0x00080001,
  254. 0x00000000, 0x02080001, 0x02080200, 0x00000200,
  255. 0x02000000, 0x02080201, 0x00080201, 0x00080000,
  256. 0x02080201, 0x00000001, 0x02000200, 0x00080201,
  257. 0x00080001, 0x00080200, 0x02080000, 0x02000201,
  258. 0x00000201, 0x02000000, 0x02000001, 0x02080200,
  259. );
  260. @SP4=(
  261. 0x01000000, 0x00002000, 0x00000080, 0x01002084,
  262. 0x01002004, 0x01000080, 0x00002084, 0x01002000,
  263. 0x00002000, 0x00000004, 0x01000004, 0x00002080,
  264. 0x01000084, 0x01002004, 0x01002080, 0x00000000,
  265. 0x00002080, 0x01000000, 0x00002004, 0x00000084,
  266. 0x01000080, 0x00002084, 0x00000000, 0x01000004,
  267. 0x00000004, 0x01000084, 0x01002084, 0x00002004,
  268. 0x01002000, 0x00000080, 0x00000084, 0x01002080,
  269. 0x01002080, 0x01000084, 0x00002004, 0x01002000,
  270. 0x00002000, 0x00000004, 0x01000004, 0x01000080,
  271. 0x01000000, 0x00002080, 0x01002084, 0x00000000,
  272. 0x00002084, 0x01000000, 0x00000080, 0x00002004,
  273. 0x01000084, 0x00000080, 0x00000000, 0x01002084,
  274. 0x01002004, 0x01002080, 0x00000084, 0x00002000,
  275. 0x00002080, 0x01002004, 0x01000080, 0x00000084,
  276. 0x00000004, 0x00002084, 0x01002000, 0x01000004,
  277. );
  278. @SP5=(
  279. 0x10000008, 0x00040008, 0x00000000, 0x10040400,
  280. 0x00040008, 0x00000400, 0x10000408, 0x00040000,
  281. 0x00000408, 0x10040408, 0x00040400, 0x10000000,
  282. 0x10000400, 0x10000008, 0x10040000, 0x00040408,
  283. 0x00040000, 0x10000408, 0x10040008, 0x00000000,
  284. 0x00000400, 0x00000008, 0x10040400, 0x10040008,
  285. 0x10040408, 0x10040000, 0x10000000, 0x00000408,
  286. 0x00000008, 0x00040400, 0x00040408, 0x10000400,
  287. 0x00000408, 0x10000000, 0x10000400, 0x00040408,
  288. 0x10040400, 0x00040008, 0x00000000, 0x10000400,
  289. 0x10000000, 0x00000400, 0x10040008, 0x00040000,
  290. 0x00040008, 0x10040408, 0x00040400, 0x00000008,
  291. 0x10040408, 0x00040400, 0x00040000, 0x10000408,
  292. 0x10000008, 0x10040000, 0x00040408, 0x00000000,
  293. 0x00000400, 0x10000008, 0x10000408, 0x10040400,
  294. 0x10040000, 0x00000408, 0x00000008, 0x10040008,
  295. );
  296. @SP6=(
  297. 0x00000800, 0x00000040, 0x00200040, 0x80200000,
  298. 0x80200840, 0x80000800, 0x00000840, 0x00000000,
  299. 0x00200000, 0x80200040, 0x80000040, 0x00200800,
  300. 0x80000000, 0x00200840, 0x00200800, 0x80000040,
  301. 0x80200040, 0x00000800, 0x80000800, 0x80200840,
  302. 0x00000000, 0x00200040, 0x80200000, 0x00000840,
  303. 0x80200800, 0x80000840, 0x00200840, 0x80000000,
  304. 0x80000840, 0x80200800, 0x00000040, 0x00200000,
  305. 0x80000840, 0x00200800, 0x80200800, 0x80000040,
  306. 0x00000800, 0x00000040, 0x00200000, 0x80200800,
  307. 0x80200040, 0x80000840, 0x00000840, 0x00000000,
  308. 0x00000040, 0x80200000, 0x80000000, 0x00200040,
  309. 0x00000000, 0x80200040, 0x00200040, 0x00000840,
  310. 0x80000040, 0x00000800, 0x80200840, 0x00200000,
  311. 0x00200840, 0x80000000, 0x80000800, 0x80200840,
  312. 0x80200000, 0x00200840, 0x00200800, 0x80000800,
  313. );
  314. @SP7=(
  315. 0x04100010, 0x04104000, 0x00004010, 0x00000000,
  316. 0x04004000, 0x00100010, 0x04100000, 0x04104010,
  317. 0x00000010, 0x04000000, 0x00104000, 0x00004010,
  318. 0x00104010, 0x04004010, 0x04000010, 0x04100000,
  319. 0x00004000, 0x00104010, 0x00100010, 0x04004000,
  320. 0x04104010, 0x04000010, 0x00000000, 0x00104000,
  321. 0x04000000, 0x00100000, 0x04004010, 0x04100010,
  322. 0x00100000, 0x00004000, 0x04104000, 0x00000010,
  323. 0x00100000, 0x00004000, 0x04000010, 0x04104010,
  324. 0x00004010, 0x04000000, 0x00000000, 0x00104000,
  325. 0x04100010, 0x04004010, 0x04004000, 0x00100010,
  326. 0x04104000, 0x00000010, 0x00100010, 0x04004000,
  327. 0x04104010, 0x00100000, 0x04100000, 0x04000010,
  328. 0x00104000, 0x00004010, 0x04004010, 0x04100000,
  329. 0x00000010, 0x04104000, 0x00104010, 0x00000000,
  330. 0x04000000, 0x04100010, 0x00004000, 0x00104010,
  331. );
  332.  
  333. sub main'des_set_key
  334.     {
  335.     local($param)=@_;
  336.     local(@key);
  337.     local($c,$d,$i,$s,$t);
  338.     local(@ks)=();
  339.  
  340.     # Get the bytes in the order we want.
  341.     @key=unpack("C8",$param);
  342.  
  343.     $c=    ($key[0]    )|
  344.         ($key[1]<< 8)|
  345.         ($key[2]<<16)|
  346.         ($key[3]<<24);
  347.     $d=    ($key[4]    )|
  348.         ($key[5]<< 8)|
  349.         ($key[6]<<16)|
  350.         ($key[7]<<24);
  351.  
  352.     &doPC1(*c,*d);
  353.  
  354.     for $i (@shifts2)
  355.         {
  356.         if ($i)
  357.             {
  358.             $c=($c>>2)|($c<<26);
  359.             $d=($d>>2)|($d<<26);
  360.             }
  361.         else
  362.             {
  363.             $c=($c>>1)|($c<<27);
  364.             $d=($d>>1)|($d<<27);
  365.             }
  366.         $c&=0x0fffffff;
  367.         $d&=0x0fffffff;
  368.         $s=    $skb0[ ($c    )&0x3f                 ]|
  369.             $skb1[(($c>> 6)&0x03)|(($c>> 7)&0x3c)]|
  370.             $skb2[(($c>>13)&0x0f)|(($c>>14)&0x30)]|
  371.             $skb3[(($c>>20)&0x01)|(($c>>21)&0x06) |
  372.                          (($c>>22)&0x38)];
  373.         $t=     $skb4[ ($d    )&0x3f                ]|
  374.             $skb5[(($d>> 7)&0x03)|(($d>> 8)&0x3c)]|
  375.             $skb6[ ($d>>15)&0x3f                 ]|
  376.             $skb7[(($d>>21)&0x0f)|(($d>>22)&0x30)];
  377.         push(@ks,(($t<<16)|($s&0x0000ffff))&0xffffffff);
  378.         $s=      ($s>>16)|($t&0xffff0000) ;
  379.         push(@ks,(($s<<4)|($s>>28))&0xffffffff);
  380.         }
  381.     @ks;
  382.     }
  383.  
  384. sub doPC1
  385.     {
  386.     local(*a,*b)=@_;
  387.     local($t);
  388.  
  389.     $t=(($b>>4)^$a)&0x0f0f0f0f;
  390.     $b^=($t<<4); $a^=$t;
  391.     # do $a first 
  392.     $t=(($a<<18)^$a)&0xcccc0000;
  393.     $a=$a^$t^($t>>18);
  394.     $t=(($a<<17)^$a)&0xaaaa0000;
  395.     $a=$a^$t^($t>>17);
  396.     $t=(($a<< 8)^$a)&0x00ff0000;
  397.     $a=$a^$t^($t>> 8);
  398.     $t=(($a<<17)^$a)&0xaaaa0000;
  399.     $a=$a^$t^($t>>17);
  400.  
  401.     # now do $b
  402.     $t=(($b<<24)^$b)&0xff000000;
  403.     $b=$b^$t^($t>>24);
  404.     $t=(($b<< 8)^$b)&0x00ff0000;
  405.     $b=$b^$t^($t>> 8);
  406.     $t=(($b<<14)^$b)&0x33330000;
  407.     $b=$b^$t^($t>>14);
  408.     $b=(($b&0x00aa00aa)<<7)|(($b&0x55005500)>>7)|($b&0xaa55aa55);
  409.     $b=($b>>8)|(($a&0xf0000000)>>4);
  410.     $a&=0x0fffffff;
  411.     }
  412.  
  413. sub doIP
  414.     {
  415.     local(*a,*b)=@_;
  416.     local($t);
  417.  
  418.     $t=(($b>> 4)^$a)&0x0f0f0f0f;
  419.     $b^=($t<< 4); $a^=$t;
  420.     $t=(($a>>16)^$b)&0x0000ffff;
  421.     $a^=($t<<16); $b^=$t;
  422.     $t=(($b>> 2)^$a)&0x33333333;
  423.     $b^=($t<< 2); $a^=$t;
  424.     $t=(($a>> 8)^$b)&0x00ff00ff;
  425.     $a^=($t<< 8); $b^=$t;
  426.     $t=(($b>> 1)^$a)&0x55555555;
  427.     $b^=($t<< 1); $a^=$t;
  428.     $t=$a;
  429.     $a=$b&0xffffffff;
  430.     $b=$t&0xffffffff;
  431.     }
  432.  
  433. sub doFP
  434.     {
  435.     local(*a,*b)=@_;
  436.     local($t);
  437.  
  438.     $t=(($b>> 1)^$a)&0x55555555;
  439.     $b^=($t<< 1); $a^=$t;
  440.     $t=(($a>> 8)^$b)&0x00ff00ff;
  441.     $a^=($t<< 8); $b^=$t;
  442.     $t=(($b>> 2)^$a)&0x33333333;
  443.     $b^=($t<< 2); $a^=$t;
  444.     $t=(($a>>16)^$b)&0x0000ffff;
  445.     $a^=($t<<16); $b^=$t;
  446.     $t=(($b>> 4)^$a)&0x0f0f0f0f;
  447.     $b^=($t<< 4); $a^=$t;
  448.     $a&=0xffffffff;
  449.     $b&=0xffffffff;
  450.     }
  451.  
  452. sub main'des_ecb_encrypt
  453.     {
  454.     local(*ks,$encrypt,$in)=@_;
  455.     local($l,$r,$i,$t,$u,@input);
  456.     
  457.     @input=unpack("C8",$in);
  458.     # Get the bytes in the order we want.
  459.     $l=    ($input[0]    )|
  460.         ($input[1]<< 8)|
  461.         ($input[2]<<16)|
  462.         ($input[3]<<24);
  463.     $r=    ($input[4]    )|
  464.         ($input[5]<< 8)|
  465.         ($input[6]<<16)|
  466.         ($input[7]<<24);
  467.  
  468.     $l&=0xffffffff;
  469.     $r&=0xffffffff;
  470.     &doIP(*l,*r);
  471.     if ($encrypt)
  472.         {
  473.         for ($i=0; $i<32; $i+=4)
  474.             {
  475.             $t=(($r<<1)|($r>>31))&0xffffffff;
  476.             $u=$t^$ks[$i  ];
  477.             $t=$t^$ks[$i+1];
  478.             $t=(($t>>4)|($t<<28))&0xffffffff;
  479.             $l^=    $SP1[ $t     &0x3f]|
  480.                 $SP3[($t>> 8)&0x3f]|
  481.                 $SP5[($t>>16)&0x3f]|
  482.                 $SP7[($t>>24)&0x3f]|
  483.                 $SP0[ $u     &0x3f]|
  484.                 $SP2[($u>> 8)&0x3f]|
  485.                 $SP4[($u>>16)&0x3f]|
  486.                 $SP6[($u>>24)&0x3f];
  487.  
  488.             $t=(($l<<1)|($l>>31))&0xffffffff;
  489.             $u=$t^$ks[$i+2];
  490.             $t=$t^$ks[$i+3];
  491.             $t=(($t>>4)|($t<<28))&0xffffffff;
  492.             $r^=    $SP1[ $t     &0x3f]|
  493.                 $SP3[($t>> 8)&0x3f]|
  494.                 $SP5[($t>>16)&0x3f]|
  495.                 $SP7[($t>>24)&0x3f]|
  496.                 $SP0[ $u     &0x3f]|
  497.                 $SP2[($u>> 8)&0x3f]|
  498.                 $SP4[($u>>16)&0x3f]|
  499.                 $SP6[($u>>24)&0x3f];
  500.             }
  501.         }
  502.     else    
  503.         {
  504.         for ($i=30; $i>0; $i-=4)
  505.             {
  506.             $t=(($r<<1)|($r>>31))&0xffffffff;
  507.             $u=$t^$ks[$i  ];
  508.             $t=$t^$ks[$i+1];
  509.             $t=(($t>>4)|($t<<28))&0xffffffff;
  510.             $l^=    $SP1[ $t     &0x3f]|
  511.                 $SP3[($t>> 8)&0x3f]|
  512.                 $SP5[($t>>16)&0x3f]|
  513.                 $SP7[($t>>24)&0x3f]|
  514.                 $SP0[ $u     &0x3f]|
  515.                 $SP2[($u>> 8)&0x3f]|
  516.                 $SP4[($u>>16)&0x3f]|
  517.                 $SP6[($u>>24)&0x3f];
  518.  
  519.             $t=(($l<<1)|($l>>31))&0xffffffff;
  520.             $u=$t^$ks[$i-2];
  521.             $t=$t^$ks[$i-1];
  522.             $t=(($t>>4)|($t<<28))&0xffffffff;
  523.             $r^=    $SP1[ $t     &0x3f]|
  524.                 $SP3[($t>> 8)&0x3f]|
  525.                 $SP5[($t>>16)&0x3f]|
  526.                 $SP7[($t>>24)&0x3f]|
  527.                 $SP0[ $u     &0x3f]|
  528.                 $SP2[($u>> 8)&0x3f]|
  529.                 $SP4[($u>>16)&0x3f]|
  530.                 $SP6[($u>>24)&0x3f];
  531.             }
  532.         }
  533.     &doFP(*l,*r);
  534.     pack("C8",$l&0xff,$l>>8,$l>>16,$l>>24,
  535.           $r&0xff,$r>>8,$r>>16,$r>>24);
  536.     }
  537.